package com.example.huadu_server.house.service;

import com.example.huadu_server.config.Response;
import com.example.huadu_server.house.dto.HouseUploadDTO;
import com.example.huadu_server.house.entity.House;
import com.example.huadu_server.landlord.entity.Landlord;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

public interface HouseService {
    /**
     * 房东上传房源
     *
     * @param houseUploadDTO 房源上传数据
     * @param landlordId     房东ID
     * @return 上传结果
     */
    Response<String> uploadHouse(HouseUploadDTO houseUploadDTO, int landlordId);

    /**
     * 搜索房源（支持分页）
     *
     * @param keyword 搜索关键词
     * @param pageNo  当前页码
     * @param pageSize 每页显示条数
     * @return 包含房源信息的分页结果
     */
    Response<Map<String, Object>> searchHouses(String keyword, int pageNo, int pageSize);

    /**
     * 筛选房源
     *
     * @param filters 筛选条件
     * @param pageNo 当前页码
     * @param pageSize 每页记录数
     * @return 筛选结果
     */
    Response<Map<String, Object>> filterHouses(Map<String, Object> filters, int pageNo, int pageSize);

    /**
     * 搜索后筛选房源
     *
     * @param conditions 条件
     * @param pageNo 当前页码
     * @param pageSize 每页记录数
     * @return 筛选结果
     */
    Response<Map<String, Object>> filterHousesByKey( Map<String, Object> conditions, int pageNo, int pageSize);

    /**·
     * 房源分页查询
     *
     * @param pageNo 当前页码
     * @param pageSize 每页记录数
     * @return 房源分页结果
     */
    Response<Map<String, Object>> getHousesByPage(int pageNo, int pageSize);

    /**
     * 根据房源ID获取房源信息
     *
     * @param houseId 房源ID
     * @param userId 用户ID
     * @return 房源信息
     */
    Response<House> getHouseById(int houseId,int userId);

    /**
     * 根据房源ID获取房源信息
     *
     * @param houseId 房源ID
     * @return 房源信息
     */
    Response<House> getHouseByIdLandlord(int houseId);

    /**
     * 根据房源的房东ID获取房东信息
     *
     * @param houseId 房源ID
     * @return
     */
    Response<Landlord> getLandlordByHouseId(int houseId);

    /**
     * 收藏房源
     *
     * @param houseId 房源ID
     * @param userId 用户ID
     * @return 收藏结果
     */
    Response<String> addFavorite(int houseId, int userId);

    /**
     * 取消收藏房源
     *
     * @param houseId 房源ID
     * @param userId 用户ID
     * @return 取消收藏结果
     */
    Response<String> removeFavorite(int houseId, int userId);

    /**
     * 猜你喜欢：基于用户行为数据（预约、浏览、消息）为用户推荐房源
     *
     * @param userId 当前用户ID
     * @param pageNo 当前页码
     * @param pageSize 每页条数
     * @return 推荐房源的分页结果
     */
    Response<Map<String, Object>> getRecommendedHouses(int userId, int pageNo, int pageSize);

    /**
     * 获取收藏房源
     *
     * @param userId 用户ID
     * @param pageNo 当前页码
     * @param pageSize 每页条数
     * @return 收藏房源的分页结果
     */
    Response<Map<String, Object>> getFavoriteHouses(int userId, int pageNo, int pageSize);


    /**
     * 获取房东的所有房源
     *
     * @param landlordId 房东ID
     * @param pageNo     当前页码
     * @param pageSize   每页显示条数
     * @return 包含房源信息的分页结果
     */
    Response<Map<String, Object>> getHousesByLandlordId(int landlordId, int pageNo, int pageSize,String status);

    /**
     * 更新房源信息
     *
     * @param house 房源信息
     * @return 更新结果
     */
    Response<String> updateHouse(House house);


    /**
     * 更新房源状态
     * @param houseId
     * @param newStatus
     * @return
     */
    Response<String> updateHouseStatus(int houseId, String newStatus);


    /**
     * 管理员审核房源
     * @param houseId 房源ID
     * @param newStatus 目标状态："available"（上架）或 "removed"（下架）
     * @param remarks 备注信息，如果是审核通过可以为空，如果审核拒绝或下架，则需填写理由
     * @return 操作结果
     */
    Response<String> auditHouse(int houseId, String newStatus, String remarks);


    /**
     * 管理员获取所有待审核的房源（状态为 pending）
     * @param pageNo 当前页码
     * @param pageSize 每页显示记录数
     * @return 分页结果，包含总数和房源列表
     */
    Response<Map<String, Object>> getPendingHouses(int pageNo, int pageSize);

    /**
     * 尝试锁定房源进行审核：
     * 如果房源未被锁定或锁定超时，则更新 lockedBy 和 lockTime，并返回 true；
     * 如果已被其他管理员锁定，则返回 false。
     * @param houseId 房源ID
     * @return 返回锁定结果：true 表示成功锁定，false 表示已经被锁定
     */
    Response<Boolean> tryLockHouse(int houseId);

    /**
     * 获取当前管理员审核过的房源
     * @param adminId 当前管理员ID
     * @param pageNo 当前页码
     * @param pageSize 每页条数
     * @return 分页结果，包含房源列表（必须包含房源图片、地址、房东姓名、房东联系方式、房源状态、备注等）
     */
    Response<Map<String, Object>> getAuditedHousesByAdmin(int adminId, int pageNo, int pageSize);


    /**
     * 下架房源接口：前端传入房源ID和下架理由，要求当前状态必须为 "available"（已上架）
     * 下架成功后，房源状态更新为 "removed"，并将下架理由保存到 remarks 字段，同时更新审核管理员的ID。
     */
    Response<String> removeHouse(int houseId, String remarks);

}
